package lhd.mybatis_simple_log.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 日志的通用工具类
 *
 * @author lhd
 * @since 2025/6/10 16:16
 */
public class LogUtil {

    /**
     * 判断是否是mybatis的sql日志
     *
     * @param log 选中的日志
     * @return true:是mybatis的sql日志; false:不是mybatis的sql日志
     */
    public static boolean isMybatisSqlLog(String log) {
        return log.contains("Preparing") && log.contains("Parameters");
    }


    /**
     * 解析日志为sql语句
     *
     * @param log 日志内容
     * @return 解析后sql语句
     */
    public static String parsingLogToSql(String log) {
        if (StringUtils.isEmpty(log)) {
            return null;
        }

        // 存储sql语句和参数
        StringBuilder sql = new StringBuilder();
        StringBuilder parameters = new StringBuilder();

        // 处理选中的日志，按每行处理
        try (Scanner scanner = new Scanner(log)) {
            // 设置换行符为分隔符
            scanner.useDelimiter("\\r?\\n");
            while (scanner.hasNext()) {
                String line = scanner.next();
                if (line.contains("Preparing")) {
                    String sqlStr = line.substring(line.indexOf("Preparing") + 10);
                    if (StringUtils.isEmpty(sqlStr)) {
                        continue;
                    }
                    sql.append(sqlStr.trim());
                } else if (line.contains("Parameters")) {
                    String parametersStr = line.substring(line.indexOf("Parameters") + 11);
                    if (StringUtils.isEmpty(parametersStr)) {
                        continue;
                    }
                    parameters.append(parametersStr.trim());
                }
            }

            if (StringUtils.isEmpty(sql.toString()) || StringUtils.isEmpty(parameters.toString())) {
                return null;
            }

            // 使用String.format()方法替换参数
            String sqlStr = sql.toString();
            sqlStr = sqlStr.replace("?", "%s");
            List<String> parameterValueList = getParameterValues(parameters);
            String parsingSql = String.format(sqlStr, parameterValueList.toArray());

            // 格式化sql
            return SqlFormatterUtil.formatSql(parsingSql);
        }


    }

    /**
     * 解析参数
     *
     * @param parameters 参数
     * @return 参数值列表
     */
    private static List<String> getParameterValues(StringBuilder parameters) {
        String[] parameterList = parameters.toString().split(",");
        List<String> parameterValueList = new ArrayList<>();
        for (String parameter : parameterList) {
            String value = parameter.substring(0, parameter.indexOf("("));
            String type = parameter.substring(parameter.indexOf("(") + 1, parameter.indexOf(")"));
            if (type.equals("Integer")
                    || type.equals("int")
                    || type.equals("Long")
                    || type.equals("long")
                    || type.equals("Float")
                    || type.equals("float")
                    || type.equals("Double")
                    || type.equals("double")
                    || type.equals("Short")
                    || type.equals("short")
            ) {
                parameterValueList.add(value);
            } else if (type.equals("Boolean") || type.equals("boolean")) {
                if (value.equals("true")) {
                    parameterValueList.add("1");
                } else {
                    parameterValueList.add("0");
                }
            } else {
                parameterValueList.add("'" + value.trim() + "'");
            }
        }
        return parameterValueList;
    }

}
